/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package simutanque;

import gtree.DrawTree;
import gtree.Position;
import gtree.Tree;
import java.io.File;
import java.util.ArrayList;

/**
 *
 * @author Augusto Wolf
 */
public class Gerencia {

    private ArrayList<Tanque> tanques;
    private static Gerencia instancia = null;
    private DrawTree drawtree;// = new DrawTree();

    private Gerencia() {
        tanques = new ArrayList<>();
        try{
            drawtree = new DrawTree();
        } catch (Exception ex) {
            
        }
    }

    public static Gerencia obterInstancia() {
        if (instancia == null) {
            instancia = new Gerencia();
        }
        return instancia;
    }

    public boolean adicionar(Tanque t) {
        for (int i = 0; i < tanques.size(); i++) {
            if (tanques.get(i).getNome().equals(t.getNome())) {
                return false;
            }
        }
        return tanques.add(t);
    }

    private boolean alterar(int posicao, Tanque t) {
        boolean b = true;
        if (tanques.get(posicao).isRodando()) {
            if (t.getAnterior() != null) {
                b = b && tanques.get(posicao).setAnterior(t.getAnterior());
                //System.out.println("B10 = " + b);
            } else {
                b = b && tanques.get(posicao).setTemperaturaDeEntrada(t.getTemperaturaDeEntrada());
                //System.out.println("B11 = " + b);
                b = b && tanques.get(posicao).setAmplitude(t.getAmplitude());
                b = b && tanques.get(posicao).setPeriodo(t.getPeriodo());
                b = b && tanques.get(posicao).setTipoFuncao(t.getTipoFuncao());
                //System.out.println("B12 = " + b);
                b = b && tanques.get(posicao).setPhDeEntrada(t.getPhDeEntrada());
                //System.out.println("B13 = " + b);
            }
        } else {
            //System.out.println("B1 = " + b);
            b = b && tanques.get(posicao).setAltura(t.getAltura());
            //System.out.println("B2 = " + b);
            b = b && tanques.get(posicao).setAnterior(t.getAnterior());
            //System.out.println("B3 = " + b);
            b = b && tanques.get(posicao).setDiametroSaida(t.getDiametroSaida());
            //System.out.println("B4 = " + b);
            b = b && tanques.get(posicao).setLargura(t.getLargura());
            //System.out.println("B5 = " + b);
            b = b && tanques.get(posicao).setProfundidade(t.getProfundidade());
            //System.out.println("B6 = " + b);
            b = b && tanques.get(posicao).setTemperaturaInicial(t.getTemperaturaInicial());
            //System.out.println("B7 = " + b);
            b = b && tanques.get(posicao).setVolumeInicial(t.getVolumeInicial());
            //System.out.println("B8 = " + b);
            b = b && tanques.get(posicao).setPhInicial(t.getPhInicial());
            //System.out.println("B9 = " + b);
            if (t.getAnterior() != null) {
                b = b && tanques.get(posicao).setAnterior(t.getAnterior());
                //System.out.println("B10 = " + b);
            } else {
                b = b && tanques.get(posicao).setTemperaturaDeEntrada(t.getTemperaturaDeEntrada());
                //System.out.println("B11 = " + b);
                b = b && tanques.get(posicao).setAmplitude(t.getAmplitude());
                b = b && tanques.get(posicao).setPeriodo(t.getPeriodo());
                b = b && tanques.get(posicao).setTipoFuncao(t.getTipoFuncao());
                //System.out.println("B12 = " + b);
                b = b && tanques.get(posicao).setPhDeEntrada(t.getPhDeEntrada());
                //System.out.println("B13 = " + b);
            }
        }
        tanques.get(posicao).atualizarVisiveis();
        return b;
    }

    public boolean alterar(Tanque t) {
        int posicao = -1;
        for (int i = 0; i < tanques.size(); i++) {
            if (tanques.get(i).getNome().equals(t.getNome())) {
                posicao = i;
            }
        }
        if (posicao == -1) {
            //System.out.println("posição -1");
            return false;
        }
        return alterar(posicao, t);
    }

    public ArrayList<Tanque> getTanques() {
        return tanques;
    }

    public int totalTanques() {
        return tanques.size();
    }

    public Tanque getTanque(int index) {
        return tanques.get(index);
    }

    public Tanque getTanque(String nome) {
        for (int i = 0; i < tanques.size(); i++) {
            if (tanques.get(i).getNome().equals(nome)) {
                return tanques.get(i);
            }
        }
        return null;
    }

    public boolean apagar(int index) {
        String nome = tanques.get(index).getNome();
        for (int i = 0; i < tanques.size(); i++) {
            try {
                if (tanques.get(i).getAnterior().getNome().equals(nome)) {
                    return false;
                }
            } catch (Exception ex) {
            }
        }
        tanques.remove(index);
        return true;
    }

    public boolean tanqueJaUtilizado(String nome) {
        for (int i = 0; i < tanques.size(); i++) {
            try {
                if (tanques.get(i).getAnterior().getNome().equals(nome)) {
                    return true;
                }
            } catch (Exception ex) {
            }
        }
        return false;
    }

    public boolean apagar(String nome) {
        return apagar(indexTanque(nome));
    }

    public int indexTanque(String nome) {
        for (int i = 0; i < tanques.size(); i++) {
            if (tanques.get(i).getNome().equals(nome)) {
                return i;
            }
        }
        return -1;
    }

    public Tree getTree() {
        try {
            Tree tree = new Tree("Início");
            ArrayList<Position> posicoes = new ArrayList<>();

            Position root = tree.root();
            for (int i = 0; i < tanques.size(); i++) {
                posicoes.add(tree.root());
            }
            for (int i = 0; i < tanques.size(); i++) {
                String nome = tanques.get(i).getNome();
                try {
                    String pai = tanques.get(i).getAnterior().getNome();
                    posicoes.set(i, tree.addChild(posicoes.get(indexTanque(pai)), nome));
                } catch (Exception ex) {
                    posicoes.set(i, tree.addChild(root, nome));
                }
            }

            ////System.out.println(tree.elements());



            //exibe a arvore 
            drawtree.setTree(tree);
            drawtree.setVisible(true);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public void pausar(boolean pausar) {
        //System.out.println("pausar = " + pausar);
        for (int i = 0; i < tanques.size(); i++) {
            tanques.get(i).pausar(pausar);
        }
    }

    public void parar() {
        //System.out.println("para");
        for (int i = 0; i < tanques.size(); i++) {
            try {
                tanques.get(i).parar();
            } catch (Exception ex) {
                UTI.erro(null, "Erro ao fechar arquivo do tanque " + tanques.get(i).getNome(), "SimuTanque - Erro");
            }
        }
        for (int i = 0; i < tanques.size(); i++) {
            tanques.set(i, new Tanque(tanques.get(i).toString()));
        }
    }

    public void iniciar(boolean b, File f, double velocidade) {
        Tanque.setVelocidade(velocidade);
        //System.out.println("iniciar");
        if (f == null) {
            for (int i = 0; i < tanques.size(); i++) {
                try {
                    tanques.get(i).setSalvar(false, null);
                } catch (Exception ex) {
                    UTI.erro(null, "Erro ao iniciar arquivo do tanque " + tanques.get(i).getNome(), "SimuTanque - Erro");
                }
                tanques.get(i).iniciar();
            }
        } else {
            for (int i = 0; i < tanques.size(); i++) {
                try {
                    tanques.get(i).setSalvar(b, new File(f.getPath() + f.separator + tanques.get(i).getNome() + ".csv"));
                } catch (Exception ex) {
                    UTI.erro(null, "Erro ao iniciar arquivo do tanque " + tanques.get(i).getNome(), "SimuTanque - Erro");
                }
                tanques.get(i).iniciar();
            }
        }
    }
}
